package Java2Test.Reflect.Reflect2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
            InvocationTargetException, InstantiationException, IllegalAccessException {

        // 1. 获取目标类的Class对象（反射的核心入口）
        // Class.forName()用于动态加载类，需提供类的全类名
        // 该方法会触发类的加载、链接和初始化过程
        Class<?> clazz1 = Class.forName("Java2Test.Reflect.Reflect2.Student");

        // 2. 获取类的构造方法
        // 2.1 getConstructors() - 仅返回public构造方法
        Constructor<?>[] publicConstructors = clazz1.getConstructors();
        System.out.println("Public Constructors:");
        for (Constructor<?> c : publicConstructors) {
            System.out.println(c);
        }

        // 2.2 getDeclaredConstructors() - 返回所有声明的构造方法（包括private/protected）
        Constructor<?>[] declaredConstructors = clazz1.getDeclaredConstructors();
        System.out.println("\nAll Declared Constructors:");
        for (Constructor<?> c : declaredConstructors) {
            System.out.println(c);
        }

        // 3. 获取特定参数列表的构造方法
        // getDeclaredConstructor()方法接收参数类型的Class对象数组
        Constructor<?> con1 = clazz1.getDeclaredConstructor();          // 无参构造
        Constructor<?> con2 = clazz1.getDeclaredConstructor(String.class); // String参数构造
        Constructor<?> con3 = clazz1.getDeclaredConstructor(int.class);    // int参数构造

        // 获取私有构造方法（String, int）
        Constructor<?> con4 = clazz1.getDeclaredConstructor(String.class, int.class);
        System.out.println("\nTarget Constructor: " + con4);

        // 4. 分析构造方法元数据
        // 4.1 获取修饰符（返回值为int，需通过Modifier类解析）
        int modifiers = con4.getModifiers();
        System.out.println("Modifier Flags: " + modifiers); // 例如：2表示private

        // 4.2 获取参数信息（Java 8+支持）
        Parameter[] parameters = con4.getParameters();
        System.out.println("Constructor Parameters:");
        for (Parameter param : parameters) {
            System.out.println("- " + param.getType().getName() + " " + param.getName());
        }

        // 5. 突破访问限制（针对private成员）
        // setAccessible(true)会关闭Java的访问控制检查
        // 注意：这可能破坏类的封装性，仅在必要时使用
        con4.setAccessible(true);

        // 6. 通过构造方法创建实例
        // 等价于：new Student("zhangsan", 23)
        // 需处理可能的异常：InstantiationException, IllegalAccessException, InvocationTargetException
        Object zhangsan = con4.newInstance("zhangsan", 23);
        System.out.println("\nCreated Instance: " + zhangsan);
    }
}